热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基准|数目_requireJS学习笔记

篇首语:本文由编程笔记#小编为大家整理,主要介绍了requireJS学习笔记相关的知识,希望对你有一定的参考价值。AM

篇首语:本文由编程笔记#小编为大家整理,主要介绍了requireJS学习笔记相关的知识,希望对你有一定的参考价值。



AMD、CMD与commonJS

requireJS实现了AMD规范,即异步加载模块,模块加载的时候不会阻塞后续代码的执行,将模块加载完后的操作(依赖该模块的程序)放到回调函数中进行。这种规范适合于浏览器端。例如:

require(['module1', 'module2'], function(mod1, mod2)
//do something; //当module1/2加载完后会执行该回调。加载时不阻塞require后面的代码
);

而(node服务端采用的是commonJS规范,commonJS是同步的,因为文件就存在于服务器,require进来的时候比较快)。例如:

var module = require ('module');
module.func();

一个文件就是一个模块,通过module.exportsexports 对象来导出模块内的方法、属性,方便外部模块引用。

requireJS不光实现了异步加载,避免页面假死,同时还管理了模块间的依赖,使得代码更容易维护。

而AMD也是异步加载的规范,与AMD不同的是,AMD推崇依赖前置,即提前加载好依赖的模块,而CMD推崇依赖就近加载(延后执行依赖模块,as lazy as possible),要用的时候才加载。二者的主要区别就是所依赖的模块的执行时机不同(依赖的加载怎么异步的?)。
例如:


  • AMD:

define(['a', 'b'], function(a, b) //当依赖的模块加载完成执行定义函数
a.func(); //a、b模块提前加载好
b.func();
return
...
;
);

如果有代码加载上面定义的模块,则会先加载[] 中所依赖的模块。
- CMD:

define(function(require, exports, module)
var a = require('a');
a.func();
...
var b = require('b');
b.func();
);

为了加载commonJS规范的模块,应该使用和CMD类似的加载依赖方式(无法通过数组参数加载依赖):

define(function(require, exports, module)
var a = require('a'),
b = require('b');
//Return the module value
return function () ;

);

此外,如果依赖是相对路径,要讲require 作为依赖添加到依赖参数:

define(["require", "./relative/name"], function(require)
var mod = require("./relative/name");
);

因此,最好的方式就是直接使用上面的commonJS的方式(simplified CommonJS wrapping,requirejs对这种包装会解析成AMD的模式)。


requireJS的使用

requireJS使用ModuleId来替代文件路径。moduleId 是有baseUrlpaths 来设置的。
由于浏览器是不识别requiredefine 等的。因此需要在页面加载文件require.js 。此外,还可以对模块的基准路径、路径、不遵循AMD规范的模块进行配置。
有两种方式,一种是调用require.config() 方法:

require.config(
baseUrl: 'js',
paths:
'module1': 'lib/module1',
...
,
shim:
'lib/jquery.validate': ['jquery'],
...

);

显然需要在require.js 文件引入之后才能调用该方法。
一种是定义一个require 全局对象:

var require =
//内容同上
;

该对象需要在require.js 文件引入之前进行定义。


requireJS实现机制



RequireJS使用head.appendChild()将每一个依赖加载为一个script标签。
RequireJS等待所有的依赖加载完毕,计算出模块定义函数正确调用顺序,然后依次调用它们。


问题: 动态生成的script标签?控制加载顺序就是生成标签的顺序,利用script标签加载好后出发load事件?

项目中提前定义require 为收集函数来收集页面中出现的require 方法,并放到页面结尾处再执行。不过使用配置文件中再次声明一个require对象覆盖了前面定义的收集函数。

参考:
requireJS中文文档


requireJS中的r.js

由于一个模块是一个JS文件(生成script 标签插入到head),加载多个模块的时候会增加请求数目。requireJS提供了一个工具即r.js来进行JS文件的合并。
定义一个模块的时候指定依赖可以使用这种方式:

//test.js
define(['jquery', 'common'], function($, common)
// do something
return
;
);

或者采用兼容commonJS语法的方式:

define(function(require,[exports, module])
var $ = require('jquery');
var common = require('common');
// do something
return
;
);

还有当以字符串数组例如require(['']) 的形式加载模块时。以上方式在r.js在进行合并时,默认会将定义的模块及其依赖的诸如jquery、common等模块合并到一个JS文件中,除非你在build.js配置文件中指定要exclude哪些文件,这样就不会合并指定的文件了。另外也可以使用include来动态指定要包括哪些文件,这样可以添加在静态分析的时候没有合并的文件。合并的时候会把直接依赖、以及依赖的依赖…均合并到一个文件中。

html中的引入:

require(['common'], function()
require(['test'], function(module)
//do something
);
);

并不是说test依赖于common,而是指定加载顺序,必须是common加载完后才能加载test。该处与模块的合并打包没有关系,仅仅指定加载顺序。模块的合并打包只与在定义模块的时候有无依赖以及build.js中的include和exclude有关。
common中包含了一些公用的文件,可以缓存。

如果A依赖B,B依赖C,在没有做exclude的时候A中会包含B、C以及A自身的模块内容。

如果A依赖B、C,B依赖C,A把B exclude了,那么也会默认把C也exclude掉。即exclude的时候会把依赖以及依赖的依赖。。。中的也排除掉,即便自身显示地依赖了‘依赖的依赖’中某个模块。

includeexclude 的解释,官方的说明比较清晰:

参考:r.js/build/example.build.js

问题:当将公用模块打包到一个文件后,别的文件要加载其中的某个模块的时候是怎么加载进来的?


推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
蓝色水气球_453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有